// 版权归Go作者所有。版权所有。
// 此源代码的使用受BSD样式
// 许可证的约束，该许可证可以在许可证文件中找到。

package math

// Dim返回x-y或0的最大值。
// 
// 特殊情况为：
// Dim（+Inf，+Inf）=NaN 
// Dim（-Inf，-Inf）=NaN 
// Dim（x，NaN）=Dim（NaN，x）=NaN 
func Dim(x, y float64) float64 {
	// 减法后的特殊情况导致NaN：
	// /+Inf-+Inf=NaN 
	// /-Inf--Inf=NaN 
	// /NaN-y=NaN 
	// x-NaN=NaN 
	v := x - y
	if v <= 0 {
		// /v为负或0 
		return 0
	}
	return v
}

// Max返回x或y中的较大值。
// 
// 特殊情况为：
// Max（x，+Inf）=Max（+Inf，x）=+Inf 
// Max（x，NaN）=Max（NaN，x）=NaN 
// Max（+0，±0）=+0
// Max（-0，-0）=-0
func Max(x, y float64) float64 {
	if haveArchMax {
		return archMax(x, y)
	}
	return max(x, y)
}

func max(x, y float64) float64 {
	// 特殊情况
	switch {
	case IsInf(x, 1) || IsInf(y, 1):
		return Inf(1)
	case IsNaN(x) || IsNaN(y):
		return NaN()
	case x == 0 && x == y:
		if Signbit(x) {
			return y
		}
		return x
	}
	if x > y {
		return x
	}
	return y
}

// Min返回x或y中的较小者。特别情况是：特别情况是：特别情况是：特别情况是：特别情况是：特别情况是：特别情况
func Min(x, y float64) float64 {
	if haveArchMin {
		return archMin(x, y)
	}
	return min(x, y)
}

func min(x, y float64) float64 {
	switch {
	case IsInf(x, -1) || IsInf(y, -1):
		return Inf(-1)
	case IsNaN(x) || IsNaN(y):
		return NaN()
	case x == 0 && x == y:
		if Signbit(x) {
			return x
		}
		return y
	}
	if x < y {
		return x
	}
	return y
}
